/-app
/-imports
/-storage
/-typings
functions.ts
index.html
    var blob: Blob = new (<any>Blob)(['<!doctype html>\n', document.documentElement.outerHTML], { type: 'application/octet-stream' });
 
1
module teapo {
2
​
3
​
4
  export function forEach<T>(array: T[], callback: (x: T, index: number) => void) {
5
    if (array.forEach) {
6
      array.forEach(callback);
7
    }
8
    else {
9
      for (var i = 0; i < array.length; i++) {
10
        callback(array[i], i);
11
      }
12
    }
13
  }
14
​
15
  export function find<T, R>(array: T[], predicate: (x: T, index: number) => R): R {
16
    var result = null;
17
    for (var i = 0; i < array.length; i++) {
18
      var x = array[i];
19
      var p = predicate(x, i);
20
      if (p) return p;
21
    }
22
  }
23
​
24
  /**
25
 * Escape unsafe character sequences like a closing script tag.
26
 */
27
  export function encodeForInnerHTML(content: string): string {
28
    // matching script closing tag with *one* or more consequtive slashes
29
    return content.replace(/<\/+script/g, (match) => {
30
      return '</' + match.slice(1); // skip angle bracket, inject bracket and extra slash
31
    });
32
  }
33
​
34
  /**
35
   * Unescape character sequences wrapped with encodeForInnerHTML for safety.
36
   */
37
  export function decodeFromInnerHTML(innerHTML: string): string {
38
    // matching script closing tag with *t*wo or more consequtive slashes
39
    return innerHTML.replace(/<\/\/+script/g, (match) => {
40
      return '<' + match.slice(2); // skip angle bracket and one slash, inject bracket
41
    });
42
  }
43
​
44
  export function encodeForAttributeName(value: string): string {
45
    var codes: number[] = [];
46
    var passableOnly = true;
47
​
48
    for (var i = 0; i < value.length; i++) {
49
      var c = value.charAt(i);
50
      var cc = value.charCodeAt(i);
51
      codes.push(cc);
52
      if (passableOnly)
53
        passableOnly = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z' || c === '_' || c === '-');
54
    }
55
​
56
    if (passableOnly)
57
      return 's-' + value;
58
    else
59
      return 'n-' + codes.join('-');
60
  }
61
​
62
  export function decodeFromAttributeName(attributeNamePart: string): string {
63
    if (attributeNamePart.slice(0, 2) === 's-')
64
      return attributeNamePart.slice(2);
65
​
66
    var codes = attributeNamePart.slice(2).split('-');
67
    var result: string[] = [];
6:5